package com.tanhua.server.service;

import com.tanhua.domain.db.QuestionUser;
import com.tanhua.domain.db.Questionnaire;
import com.tanhua.domain.db.QuestionnaireReport;
import com.tanhua.domain.db.SoulQuestion;
import com.tanhua.domain.enums.ReportEnum;
import com.tanhua.domain.enums.ReportImageEnum;
import com.tanhua.domain.vo.*;
import com.tanhua.dubbo.api.db.QuestionnaireReportApi;
import com.tanhua.dubbo.api.db.SoulTestApi;
import com.tanhua.server.interceptor.UserHolder;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.BeanUtils;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.stream.Collectors;

/**
 * 灵魂测试的service
 * @author 范旭升
 * @create 2021/8/6 18:23
 */
@Service
public class TestSoulService {

    @Reference
    private SoulTestApi soulTestApi;

    @Reference
    private QuestionnaireReportApi questionnaireReportApi;

    /**
     * 获取所有灵魂试题
     * @return responseEntity
     */
    @GetMapping
    public ResponseEntity<Object> testSoulList () {
        Long userId = UserHolder.getUserId();
        //通过用户id 查询所有表
        List<QuestionUser> questionUsers = soulTestApi.findQuestionUserByUserId(userId);
        //有可能有的用户刚来没有任何关联的问卷 需要进行关联
        if (null == questionUsers || questionUsers.size() ==0) {
            //往用户中插入问卷
            List<Questionnaire> questionnaires = soulTestApi.findAllQuestionnaire();
            for (Questionnaire questionnaire : questionnaires) {
                soulTestApi.saveUserAndQuestionnaire(userId,questionnaire);
            }
            questionUsers = soulTestApi.findQuestionUserByUserId(userId);
        }
        //将问卷封装
        List<QuestionnaireVo>questionnaireVos = new ArrayList<>();
        for (QuestionUser questionUser : questionUsers) {
            QuestionnaireVo questionnaireVo = new QuestionnaireVo();
            Questionnaire questionnaire = soulTestApi.findQuestionnaireById(questionUser.getQuestionnaireId());
            BeanUtils.copyProperties(questionnaire,questionnaireVo);
            if (questionUser.getReportId() != null) {
                questionnaireVo.setReportId(questionUser.getReportId().toString());
            }
            questionnaireVo.setId(questionnaire.getId()+"");
            //题干
            List<SoulQuestion> soulQuestions = questionnaire.getSoulQuestions();
            List<SoulQuestionVo> soulQuestionVos = new ArrayList<>();
            for (SoulQuestion soulQuestion : soulQuestions) {
                SoulQuestionVo soulQuestionVo = new SoulQuestionVo();
                soulQuestionVo.setId(soulQuestion.getId().toString());
                soulQuestionVo.setQuestion(soulQuestion.getQuestion());
                List<SoulOptionVo> soulOptionVos = soulQuestion.getOptions().stream().map(item -> {
                    SoulOptionVo soulOptionVo = new SoulOptionVo();
                    soulOptionVo.setId(item.getId().toString());
                    soulOptionVo.setOption(item.getOption());
                    return soulOptionVo;
                }).collect(Collectors.toList());
                soulQuestionVo.setOptions(soulOptionVos);
                soulQuestionVos.add(soulQuestionVo);
            }
            questionnaireVo.setIsLock(questionUser.getIsLock());
            questionnaireVo.setQuestions(soulQuestionVos);
            questionnaireVos.add(questionnaireVo);
        }
        return ResponseEntity.ok(questionnaireVos);
    }


    /**
     * 根据分数 统计出用户性格 存入报告表中
     * @param answers 获取请求数据
     * @return responseEntity
     */
    public ResponseEntity<String> submitTest(Map<String, List<AnswersVo>> answers) {
        List<AnswersVo> answersVos = answers.get("answers");
        //获取总分数
        Integer totalScore = soulTestApi.totalScore(answersVos);
        //报告表封装
        QuestionnaireReport questionnaireReport = new QuestionnaireReport();
        questionnaireReport.setUserId(UserHolder.getUserId());
        //获取理论值
        if (totalScore < 21) {
            questionnaireReport.setReportText(ReportEnum.OWT.getValue());
            questionnaireReport.setCover(ReportImageEnum.OWT.getValue());
            questionnaireReport.setLogoText("OWT");
        } else if (totalScore <= 40) {
            questionnaireReport.setReportText(ReportEnum.WHITE_RABBIT.getValue());
            questionnaireReport.setCover(ReportImageEnum.WHITE_RABBIT.getValue());
            questionnaireReport.setLogoText("WHITE_RABBIT");
        } else if (totalScore <= 55) {
            questionnaireReport.setReportText(ReportEnum.FOX.getValue());
            questionnaireReport.setCover(ReportImageEnum.FOX.getValue());
            questionnaireReport.setLogoText("FOX");
        } else {
            questionnaireReport.setReportText(ReportEnum.LION.getValue());
            questionnaireReport.setCover(ReportImageEnum.LION.getValue());
            questionnaireReport.setLogoText("LION");
        }
        //封装理性分数
        getUtopianTheoreticalValue(questionnaireReport);
        questionnaireReport.setId(questionnaireReportApi.saveTheQuestionnaireReport(questionnaireReport));
        //根据问题来获取questionnaireId
        String questionId = answersVos.get(0).getQuestionId();
        Integer questionnaireIdByQuestionId = soulTestApi.getQuestionnaireIdByQuestionId(Long.parseLong(questionId));
        //更改questionUser表中的reportId
        soulTestApi.saveQuestionUserReportId(UserHolder.getUserId(),Long.parseLong(questionnaireIdByQuestionId+""),questionnaireReport.getId());
        //解锁下一级
        soulTestApi.unLock(UserHolder.getUserId());
        return ResponseEntity.ok(questionnaireReport.getId().toString());
    }

    /**
     * 根据分数 统计出用户性格 统计最后的结果进行收集返回
     * @param id 报告的
     * @return responseEntity
     */
    public ResponseEntity<Object> getTest(Long id) {
        ReportVo reportVo = new ReportVo();
        QuestionnaireReport questionnaireReport = questionnaireReportApi.findOneById(id);
        List<DimensionsVo> dimensionsVos = new ArrayList<>();
        dimensionsVos.add(new DimensionsVo("外向",questionnaireReport.getExtroversion()+"%"));
        dimensionsVos.add(new DimensionsVo("判断",questionnaireReport.getJudgement()+"%"));
        dimensionsVos.add(new DimensionsVo("抽象",questionnaireReport.getAbstraction()+"%"));
        dimensionsVos.add(new DimensionsVo("理性",questionnaireReport.getRetionality()+"%"));
        reportVo.setDimensions(dimensionsVos);
        reportVo.setCover(questionnaireReport.getCover());
        reportVo.setConclusion(questionnaireReport.getReportText());
        //获取相似用户
        final List<SimilarYouVo> similarYouVo = soulTestApi.findSimilarYouVo(questionnaireReport.getUserId(),questionnaireReport.getLogoText());
        reportVo.setSimilarYou(similarYouVo);
        return ResponseEntity.ok(reportVo);
    }

    /**
     * 随机分配给用户各种理性值
     * @param questionnaireReport 报告类
     */
    private void getUtopianTheoreticalValue(QuestionnaireReport questionnaireReport) {
        Random random = new Random();
        questionnaireReport.setExtroversion(random.nextInt(35) + 60);
        questionnaireReport.setJudgement(random.nextInt(35) + 60);
        questionnaireReport.setAbstraction(random.nextInt(35) + 60);
        questionnaireReport.setRetionality(random.nextInt(35) + 60);
    }
}